/*-----------------------------------------------File Info------------------------------------------------
** File Name:               osHardware.c  
** Last modified date:      2016.07.22
** Last version:            V0.1
** Description:             
**--------------------------------------------------------------------------------------------------------            
** Created date:            2016.09.07
** author:                  YLY
** Version:                 V0.1
** Descriptions:            系统与硬件相关部分代码,移植的重点. 
**--------------------------------------------------------------------------------------------------------
*/

/*************************************************************
* 	include 
* 	头文件	
*************************************************************/ 
/*  与硬件相关的库文件  */
#include <stdio.h>

/* 系统配置文件 */ 
#include "osConfig.h"
/* 重定义文件 */
#include "osTypedef.h"
/*消息队列,用户可以此文件创建所需的各种类型的消息队列*/
#include "osTask.h"
/*事件创建/调度用户需要加载*/
#include "osEvent.h" 
/*定时器创建/调度用户需要加载*/
#include "osTimer.h"
/*系统调度和系统延时用户需要加载*/
#include "osScheduler.h"
/*OS驱动*/
#include "osHardware.h"
uint16_t criticalNesting;
bool gClrWdt=false;

/**
 *  看门狗初始化,看门狗1S喂狗一次
 */
void wdtInit(void)
{
	#if 0
		SYS_UNLOCK_REG();
		
		*(SYS_WDT_CTL) = (8 << SYS_WDT_TOUTSEL_POS) | 
						SYS_WDT_EN | 
						SYS_WDT_RSTEN | 
						SYS_WDT_WKEN;
		
		*(SYS_WDT_ALCTL) = 0;	
		SYS_LOCK_REG();

	#else	
		/* enable IRC40K */
		rcu_osci_on(RCU_IRC40K);
		/* wait till IRC40K is ready */
		while(ERROR == rcu_osci_stab_wait(RCU_IRC40K));	
	
		/* enable write access to FWDGT_PSC and FWDGT_RLD registers.
		   FWDGT counter clock: 40KHz(IRC40K) / 64 = 0.625 KHz =1.6mS */
		fwdgt_config(0xfff,FWDGT_PSC_DIV64);
		fwdgt_enable();
	#endif
}

/**
 *  喂狗
 */
void clrWdt(void)
{
	#if 0	
		*(SYS_WDT_RSTCNT) = SYS_WDT_RST; 	
	#else			
		fwdgt_counter_reload();
	#endif	
}

/**
 *  系统定时器初始化
 */
void sysTickInit(void)
{
	*(SYSTICK_CTRL) = 0;
	
	/* 装载TICK定时器初值 */	
	*(SYSTICK_LOAD) = (SYS_CLOCK_HZ/TICK_RATE_HZ) - 1UL; 
	
	/*  写入任意值 清零*/	
	*(SYSTICK_VAL) = 0;
	
	/* 使能ITCK定时器 */	
	*(SYSTICK_CTRL) = SYSTICK_CLK_BIT | SYSTICK_INT_BIT | SYSTICK_ENABLE_BIT;	
}

/* 
*	sytTick是一个递减就寄存器，从SYSTICK_LOAD减到0，重装 
*/
uint32_t getSysTickVal(void)
{
	return 	*(SYSTICK_VAL);
}

/* 获取系统装载值 */
uint32_t getSysTickLoad(void)
{
	return 	*(SYSTICK_LOAD);
}

/* 读控制寄存器 */
static uint32_t getSysTickCrtl(void)
{
	return 	*(SYSTICK_CTRL);	//读取 SysTick->CTRL 以清除溢出标志
}
/**
 *  系统定时器向量入口
 */
void SYSTEM_TIME_ISR (void)	
{	
	static uint16_t i=0;
		
	getSysTickCrtl();
	#if (EN_IDLE_TASK == 1) && (DEFAULT_IDLE_TASK == 1) && \
		(OS_DEBUG_LEVEL != CLOSE) && (OS_DEBUG_LEVEL != ERROR)	
		static uint16_t j=0;
	#endif
	if(++i >= SEC_COUNT)
	{
		i = 0;
		gClrWdt = true;
		#if (EN_IDLE_TASK == 1) && (DEFAULT_IDLE_TASK == 1) && \
			(OS_DEBUG_LEVEL != CLOSE) && (OS_DEBUG_LEVEL != ERROR)	
			if(++j >= OUTPUT_OS_INFO_TIME)
			{
				j = 0;
				sendMsgToTask(IDLE_TASK_ID,OUTPUT_OS_INFO,NULL,0);
			}
		#endif	
	}
	timerScheduler();	 	/* 定时器调度 */
	osEventTimerIsr();		/* 事件中断处理函数 */
	osSchedulerTimerIsr();	/* 调度器中断处理函数*/
}

